#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;

char mp[20][20];      //地图
bool  st[20][20][20][20] ;         //标记是否走过
int n, m;     //地图大小
int  moves[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};

string path; //标记路径
char  vroad[4] = { 'U','R','D','L' };      //标记行走方向
int  ans = 0;     //记录到达终点以后的返回值

//判断要走的位置是否符合规定
bool bound(int a, int b)
{
	return a >= 0 && a < n && b >= 0 && b < m && mp[a][b] != '#';
}

int dfs(int px, int py, int bx, int by)
{
	//如果箱子位置与终点位置重合则探索结束进行回溯
	if (mp[bx][by] == '@')
	{
		return 1;
	}

	//分别判断此时位置的四个方向是否可走
	for (int i = 0; i < 4; i++)
	{
		//若沿此方向走不合法
		if (!bound(px + moves[i][0], py + moves[i][1])) continue;

		else
		{
			//若沿此方向走到达位置与箱子位置重合,并且往此方向推进箱子合法
			if ((px + moves[i][0] == bx && py + moves[i][1] == by))
			{
				//若此方向（箱子位置改变）到达位置走过
				if (bound(bx + moves[i][0], by + moves[i][1]))
				{
					if (st[px + moves[i][0]][py + moves[i][1]][bx + moves[i][0]][by + moves[i][1]]) continue;
					//标记走过
					st[px + moves[i][0]][py + moves[i][1]][bx + moves[i][0]][by + moves[i][1]] = true;

					//如果到达终点得到返回值1则将这一操作存进字符串并回溯
					ans = dfs(px + moves[i][0], py + moves[i][1], bx + moves[i][0], by + moves[i][1]);
					if (ans == 1)
					{
						path += vroad[i];
						//k++;
						ans = 0;
						return 1;
					}
				}
			}

			//若沿此方向走到达位置与箱子位置没有重合
			else
			{
				if (st[px + moves[i][0]][py + moves[i][1]][bx][by]) continue;
				//若此方向（箱子位置没有改变）到达位置没有走过

				//标记走过
				st[px + moves[i][0]][py + moves[i][1]][bx][by] = true;
				ans = dfs(px + moves[i][0], py + moves[i][1], bx, by);
				//如果到达终点得到返回值1则将这一操作存进字符串并回溯
				if (ans == 1)
				{
					path += vroad[i];
					//k++;
					ans = 0;
					return 1;
				}
			}
		}
	}
	//没有到达终点
	return 0;
}



int main()
{
	cin >> n >> m;

	int spx, spy;   //起点位置
	int sbx, sby;   //箱子位置
	
	//输入地图元素并标记起点、终点以及箱子的位置
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			//地图元素
			cin >> mp[i][j];
			cout << mp[i][j] << " ";
			//起点
			if (mp[i][j] == 'X')
			{
				spx = i;
				spy = j;
			}
			//箱子位置
			if (mp[i][j] == '*')
			{
				sbx = i;
				sby = j;
			}
		}
		cout << endl;
	}
	int px = spx, py = spy, bx = sbx, by = sby;
	dfs(px, py, bx, by);


	//无法到达终点
	if (path == "") cout << -1;
	//到达终点输出操作
	else
	{
		reverse(path.begin(), path.end());

		cout << path << "\n";
	}

	return 0;
}
//
//
//
//
//
////测试样例
//
////输入1
////6 6 
////. . . . X # 
////. . . # # #
////# * . . . @
////. . # . # .
////. . # . . .
////. . # # # #
//
//
//////输入2
////6 6
////. . . . @ # 
////. . . # # #
////# . . * . .
////. . # . # .
////. . # .X .
////. . # # # #
//
//
//////输入3
////6 6
////. ..X @ # 
////. . . # # #
////#  * . . . .
////. . # . # .
////. . # . . .
////. . # # # #